#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define SIZE 10
 
//类型 （图纸）
struct B
{
	char c;
	short s;
	double d;
};

struct Stu
{
	//成员变量
	struct B sb; //(也可以是另外一个结构体)
	char name[20];//名字
	int age;//年龄
	char id[20]; //x学号
}s1, s2;  //s1和s2 也是结构体变量  是全局变量

void print1(struct Stu t)
{
	printf("%c %d %lf %s %d %s\n", t.sb.c, t.sb.s, t.sb.d, t.name,t.age,t.id);
}

void print2(struct Stu *ps) //地址传过来用指针变量来接收
{
	//printf("%c %d %lf %s %d %s\n", (*ps).sb.c, (*ps).sb.s, (*ps).sb.d, (*ps).name, (*ps).age, (*ps).id);
	printf("%c %d %lf %s %d %s\n", ps->sb.c, ps->sb.s, ps->sb.d, ps->name, ps->age, ps->id);
}
int main() {
	/*数组：一组相同类型的元素的集合
	结构体：也是一些值的集合，但是值的类型可以不同！*/
		 
	//一。
	//s是局部变量
	struct  Stu s = { {'w',20,3.14},"张三",30,"2345676543"};//对象 （房子）
	// . -> 结构体成员访问
	//printf("%c\n", s.sb.c);
	//printf("%c\n", s.id);

	//二.结构体指针
	//struct  Stu * ps = &s; //struct  Stu 是在说明该指针对象类型
	//printf("%c\n", (*ps).sb.c); //*ps 解引用 值
	//printf("%c\n", ps->sb.c);  //ps 找位置

	//三。结构体传参   写一个函数打印 s 的内容
	print1(s);  //传值调用   浪费了空间和时间 效率低

	print2(&s); //传址调用 （首选）  传的是一个结构体变量的地址


	//函数传参的时候，参数是需要压栈的.如果传递一个结构体对象的时候，结构体过大，参数压栈的系统开销比较大，所以会导致性能的下降。
	//所以结构体传参的时候，要传结构体的地址

	/*栈，是一种数据结构
	  先进的后出，后进的先出*/
	//弹匣一样，先压的子弹最后打出去

	//函数调用的参数压栈

	/*每一个函数调用
		都会在内存的栈区上
		开辟一块空间！*/
	return 0;
} 
 